/**
 * Clase Driver.java
 * @author Paola Garcia 10205, Diego Yon 10070, Claudia Grajeda 10118
 * Algoritmos y estructura de datos
 * Fecha de entrega: 21 noviembre 2011
 */

import java.io.*;

import java.util.Scanner;


public class Driver {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws IOException {
		
		Scanner ingreso = new Scanner(System.in);
		String instruccion;
		int letra1, num_defun = 0;
		int letra2 = 1;
		int contador = 0;
		boolean seguir = true;
		int parentesis;
		String operando = "";
		double[] operandos2;
		double resultado;
		String operandos = "";
		char[] cadena;
		String[] nombre_defun = new String[20];
		int[] num_param = new int[20];
		Aritmeticas aritmetica;
		Parentesis parentesis1;
		Defun defun;
		Defun[] defun0 = new Defun[20];
		boolean mayor, igual;
	
		
		System.out.println("-----PROYECTO 3 ------");
		System.out.println("Para salir del programa escriba 'exit' ");
		
		do{
		
			do{
				System.out.print(">>");
				instruccion = ingreso.nextLine();
				if (instruccion.length()==0)
					System.out.print("");
				else{
					if (((instruccion.startsWith("(") != true) && (instruccion.compareToIgnoreCase("exit") != 0)) || ((instruccion.compareToIgnoreCase("exit") != 0) && (instruccion.endsWith(")") != true))){
						System.out.println("Error: comando incorrecto");
					}
				}
			}while(((instruccion.startsWith("(") != true) && (instruccion.compareToIgnoreCase("exit") != 0)) || ((instruccion.compareToIgnoreCase("exit") != 0) && (instruccion.endsWith(")") != true)));
			
			if(instruccion.length()==2){
				System.out.println("NIL");
			}
			else{
				if (instruccion.compareToIgnoreCase("exit") != 0){
					
										
					if (instruccion.substring(1,6).compareToIgnoreCase("defun") == 0){
						instruccion = instruccion.substring(7);
						//System.out.println(instruccion);
						defun = new Defun(instruccion);
						defun0[num_defun] = defun;
						num_param[num_defun] = defun.getNum();
						nombre_defun[num_defun] = defun.getNombre();
						nombre_defun[num_defun] = nombre_defun[num_defun].substring(0,nombre_defun[num_defun].length()-1);
						num_defun++;
					}
					else{///////////////////////////
										
						//las instrucciones la pasamos a un arreglo
						cadena = new char [instruccion.length()];
						cadena = instruccion.toCharArray();
			
						parentesis = 0;
						//numero de operaciones a realizar, se cuenta numero de parentesis
						for (letra1 = 0; letra1 < instruccion.length(); letra1++){
							if (cadena[letra1] == ')'){
								parentesis++;
							}
						}
						
						//System.out.println("parentesis:");
						//System.out.println(parentesis);
						if (parentesis > 1){
							do{ 
								parentesis1 = new Parentesis(instruccion, parentesis);
								instruccion = parentesis1.instruccion_unica();
								parentesis--;
								cadena = instruccion.toCharArray();
								
							}while(parentesis != 1);
							
						}
						
						
						if(parentesis == 1){
							//obtener la cadena de la operacion, longitud de la cadena que representa la operacion
							for (letra1 = 0; letra1 < instruccion.length(); letra1++ ){
								if ((cadena[letra1]) == ' ' ){
									contador = letra1;
								letra1 = instruccion.length();
								}
							}
							
							operando = instruccion.substring(1,contador);
				
							//obtener el resto de la instruccion sin el operando principal
							instruccion = instruccion.substring(contador,instruccion.length());
							letra2 = contador++;
							
							
							if((operando.compareTo("+")) == 0 || (operando.compareTo("-") == 0)
									|| operando.compareTo("*") == 0 || operando.compareTo("/") == 0
									|| operando.compareTo(">") == 0 || operando.compareTo("<") == 0
									|| operando.compareToIgnoreCase("EQUAL") == 0 || operando.compareTo(">=") == 0
									|| operando.compareTo("<=") == 0 || operando.compareTo("=") == 0){
							
											
									contador = 0;
									
									//numero de operadores
									for (letra1= letra2; letra1 < instruccion.length(); letra1++ ){
										if ((cadena[letra1]) == ' ' ){
											contador++;
										}
									}	
									
									if (operando.compareToIgnoreCase("EQUAL") == 0 || operando.compareTo("=") == 0 || 
											operando.compareTo("<=") == 0 || operando.compareTo(">=") == 0){
										operandos = instruccion.substring(1);
										
									}
									
									else {
										letra2--;
										operandos = instruccion.substring(letra2,instruccion.length());
									}
										
									aritmetica = new Aritmeticas (operandos, contador);
									operandos2 = new double[contador];
									operandos2 = aritmetica.VectorOpernados();
									
									if (operando.compareTo("+") == 0){
										resultado = aritmetica.sumar(operandos2);
										System.out.println(resultado);
									}
									if (operando.compareTo("-") == 0){
										resultado = aritmetica.restar(operandos2);
										System.out.println(resultado);
									}
									if (operando.compareTo("*") == 0){
										resultado = aritmetica.multiplicar(operandos2);
										System.out.println(resultado);
									}
									if (operando.compareTo("/") == 0){
										resultado = aritmetica.dividir(operandos2);
										System.out.println(resultado);
									}
									if (operando.compareTo("<") == 0){
										mayor = aritmetica.comparar_menor(operandos2);
										if (mayor)
											System.out.println("T");
										else
											System.out.println("NIL");
									}
									if (operando.compareTo(">") == 0){
										mayor = aritmetica.comparar_mayor(operandos2);
										if (mayor)
											System.out.println("T");
										else
											System.out.println("NIL");
									}
									
									if (operando.compareTo(">=") == 0){
										mayor = aritmetica.comparar_mayor_igual(operandos2);
										if (mayor)
											System.out.println("T");
										else
											System.out.println("NIL");
									}
									
									if (operando.compareTo("<=") == 0){
										mayor = aritmetica.comparar_menor_igual(operandos2);
										if (mayor)
											System.out.println("T");
										else
											System.out.println("NIL");
									}
									
									if(operando.compareToIgnoreCase("EQUAL") == 0 || operando.compareTo("=") == 0){
									      igual = aritmetica.equal(operandos2);
									      if(igual)
									       System.out.println("T");
									      else
									       System.out.println("NIL");
									      
									}
								}
							
							
							else{
												
									cadena = instruccion.toCharArray();
									letra2 = contador;
									contador = 0;
									
									//numero de operadores
									for (letra1= 0; letra1 < instruccion.length(); letra1++ ){
										if ((cadena[letra1]) == ' ' ){
											contador++;
										}
									}	
									//revisar si tiene el numero de parematros indicado
									for (int pos=0; pos<20;pos++){//obtener la posicion de la funcion en el vector
										if (nombre_defun[pos].compareToIgnoreCase(operando) == 0 ){									
											if(num_param[pos] == contador){
												defun0[pos].setParametros(instruccion);
												
												
												seguir = false;
											}
											else{
												System.out.println("error");
												seguir = false;
											}
											
											
											pos = 20;
										}
										
									
								}
							}
								
								
						}
					}
				}
					
			}
		}while(instruccion.compareToIgnoreCase("exit") != 0);
		System.out.println("Fin");
	}
}
